package com.christina.engine.state.impl;

import com.christina.engine.state.AbstractConversationState;
import com.christina.engine.state.ConversationState;
import com.christina.engine.state.model.StateContext;
import com.christina.engine.state.model.StateTransitionResult;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;

/**
 * 初始状态
 * 对话的起始状态，负责欢迎用户并引导后续交互
 * 
 * @author Christina
 */
@Component
public class InitialState extends AbstractConversationState {
    
    public static final String STATE_NAME = "Initial";
    
    public InitialState() {
        super(STATE_NAME, StateType.INITIAL, 300000); // 5分钟超时
    }
    
    @Override
    protected StateTransitionResult doOnEnter(StateContext context) {
        // 设置初始状态数据
        context.setStateData("welcomeShown", false);
        context.setStateData("userGreeted", false);
        
        // 生成欢迎消息
        String welcomeMessage = generateWelcomeMessage(context);
        context.setStateData("welcomeShown", true);
        
        return StateTransitionResult.waitForUserInput(welcomeMessage);
    }
    
    @Override
    protected StateTransitionResult doHandleMessage(String message, StateContext context) {
        // 验证输入
        ValidationResult validation = validateInput(message, context);
        if (!validation.isValid()) {
            return StateTransitionResult.stayInCurrentState(validation.getErrorMessage());
        }
        
        // 处理取消命令
        if (isCancelCommand(message)) {
            return StateTransitionResult.endConversation("好的，如果您需要帮助，随时可以联系我。");
        }
        
        // 处理帮助命令
        if (isHelpCommand(message)) {
            return StateTransitionResult.stayInCurrentState(getHelpMessage(context));
        }
        
        // 标记用户已问候
        context.setStateData("userGreeted", true);
        
        // 分析用户意图并决定下一个状态
        String intent = analyzeUserIntent(message, context);
        ConversationState nextState = determineNextState(intent, context);
        
        if (nextState != null) {
            String responseMessage = generateTransitionMessage(intent, nextState);
            return StateTransitionResult.success(nextState, responseMessage);
        } else {
            // 无法确定意图，转到信息收集状态
            return StateTransitionResult.success(
                    getInformationGatheringState(), 
                    "我想更好地了解您的需求。请告诉我您希望我帮您做什么？"
            );
        }
    }
    
    @Override
    protected StateTransitionResult doOnTimeout(StateContext context) {
        boolean welcomeShown = context.getStateData("welcomeShown", false);
        
        if (!welcomeShown) {
            // 如果还没有显示欢迎消息，显示一个简短的提示
            return StateTransitionResult.stayInCurrentState("您好！我是Christina，您的智能助手。有什么可以帮助您的吗？");
        } else {
            // 如果已经显示了欢迎消息但用户没有回应，结束对话
            return StateTransitionResult.endConversation("看起来您暂时不需要帮助。如有需要，随时可以联系我！");
        }
    }
    
    @Override
    public List<ConversationState> getPossibleNextStates(StateContext context) {
        return Arrays.asList(
                getProcessingState(),
                getInformationGatheringState(),
                getCompletedState()
        );
    }
    
    @Override
    protected String getHelpMessage(StateContext context) {
        return "欢迎使用Christina智能助手！\n\n" +
               "我可以帮助您：\n" +
               "• 规划旅行行程\n" +
               "• 回答各种问题\n" +
               "• 提供建议和推荐\n" +
               "• 管理您的个人设置\n\n" +
               "请告诉我您需要什么帮助，或者输入具体的问题。\n" +
               "输入 '取消' 可以结束对话。";
    }
    
    /**
     * 生成欢迎消息
     * 
     * @param context 状态上下文
     * @return 欢迎消息
     */
    private String generateWelcomeMessage(StateContext context) {
        String username = null;
        if (context.getUserContext() != null && context.getUserContext().getProfile() != null) {
            username = context.getUserContext().getProfile().getUsername();
        }

        if (username != null && !username.trim().isEmpty()) {
            return String.format("您好，%s！我是Christina，您的智能助手。今天有什么可以帮助您的吗？", username);
        } else {
            return "您好！我是Christina，您的智能助手。今天有什么可以帮助您的吗？";
        }
    }
    
    /**
     * 分析用户意图
     * 
     * @param message 用户消息
     * @param context 状态上下文
     * @return 意图类型
     */
    private String analyzeUserIntent(String message, StateContext context) {
        String lowerMessage = message.toLowerCase().trim();
        
        // 出行相关意图
        if (lowerMessage.contains("旅行") || lowerMessage.contains("出行") || 
            lowerMessage.contains("规划") || lowerMessage.contains("行程") ||
            lowerMessage.contains("机票") || lowerMessage.contains("酒店") ||
            lowerMessage.contains("travel") || lowerMessage.contains("trip")) {
            return "travel";
        }
        
        // 问答相关意图
        if (lowerMessage.contains("什么") || lowerMessage.contains("怎么") || 
            lowerMessage.contains("为什么") || lowerMessage.contains("如何") ||
            lowerMessage.contains("?") || lowerMessage.contains("？") ||
            lowerMessage.startsWith("请问") || lowerMessage.startsWith("想知道")) {
            return "question";
        }
        
        // 用户设置相关意图
        if (lowerMessage.contains("设置") || lowerMessage.contains("偏好") || 
            lowerMessage.contains("配置") || lowerMessage.contains("个人资料") ||
            lowerMessage.contains("setting") || lowerMessage.contains("profile")) {
            return "user_settings";
        }
        
        // 推荐相关意图
        if (lowerMessage.contains("推荐") || lowerMessage.contains("建议") || 
            lowerMessage.contains("介绍") || lowerMessage.contains("recommend")) {
            return "recommendation";
        }
        
        // 一般聊天意图
        if (lowerMessage.contains("你好") || lowerMessage.contains("hello") || 
            lowerMessage.contains("hi") || lowerMessage.contains("嗨") ||
            lowerMessage.contains("聊天") || lowerMessage.contains("chat")) {
            return "general_chat";
        }
        
        return "unknown";
    }
    
    /**
     * 根据意图确定下一个状态
     * 
     * @param intent 意图类型
     * @param context 状态上下文
     * @return 下一个状态
     */
    private ConversationState determineNextState(String intent, StateContext context) {
        switch (intent) {
            case "travel":
                context.setStateData("targetService", "travel");
                return getInformationGatheringState();
            
            case "question":
            case "general_chat":
            case "recommendation":
                context.setStateData("targetService", "chat");
                return getProcessingState();
            
            case "user_settings":
                context.setStateData("targetService", "user");
                return getInformationGatheringState();
            
            default:
                return null; // 无法确定，需要更多信息
        }
    }
    
    /**
     * 生成状态转换消息
     * 
     * @param intent 意图类型
     * @param nextState 下一个状态
     * @return 转换消息
     */
    private String generateTransitionMessage(String intent, ConversationState nextState) {
        switch (intent) {
            case "travel":
                return "好的，我来帮您规划旅行。请告诉我您的出发地和目的地。";
            
            case "question":
                return "我来为您解答问题。";
            
            case "general_chat":
                return "很高兴与您聊天！";
            
            case "recommendation":
                return "我来为您提供推荐建议。";
            
            case "user_settings":
                return "我来帮您管理个人设置。请告诉我您想要修改什么？";
            
            default:
                return "好的，让我来帮助您。";
        }
    }
    
    // 获取其他状态的辅助方法（这些方法应该通过依赖注入或状态注册表获取）
    private ConversationState getProcessingState() {
        // 这里应该通过状态管理器获取ProcessingState实例
        // 为了简化，暂时返回null，实际实现中需要正确的依赖注入
        return new ProcessingState();
    }
    
    private ConversationState getInformationGatheringState() {
        return new InformationGatheringState();
    }
    
    private ConversationState getCompletedState() {
        return new CompletedState();
    }
}